# 1 多态: 同样一个函数在不同的场景下有不同的状态  Animal Dog Cat / speak
# 2 多态应用场景: make_noise相当于搭建一个舞台, 让对象唱戏
# 3 传入子类对象会执行子类的api函数, 传入父类对象会传入父类的api函数

# 函数重写: 子类把父类的函数又重新写了一遍 父类和子类之间
# 函数重载: 在同一个类里面 函数的名字一样,但是参数或者返回值不一样
class Animal(object):
    def speak(self):
        print('动物 恩恩')

    # def speak(self, aaa):    # Python不支持传统意义上的方法重载
    #     print('动物 恩恩')


class Dog(Animal):
    def speak(self):
        print('汪汪汪')


class Cat(Animal):
    def speak(self):
        print('喵喵喵')


# 搭建一个舞台,让对象唱戏
# 只要父类对象做函数参数, 就容易发生多态
def make_noise(animal : Animal):
    animal.speak()  #####

if __name__ == '__main__':
    animal = Animal()
    dog = Dog()
    cat = Cat()

    make_noise(animal)
    make_noise(dog)
    make_noise(cat)


